
// 更多内容：https://www.jianshu.com/p/44ae73a58ebc
//*************** 抽象类  *****************/

// 抽象类
abstract class Doer {
  void getData();
}
// 继承抽象类 就要实现所有抽象类里的方法
class Point extends Doer {
  num x;
  num y;
  //构造器的简写
  Point({this.x, this.y});
  // 额外的构造器
  Point.origin() {
    print('进来了');
    x = 0;
    y = 0;
  }
  // 类方法
  num getString() {
    return this.x;
  }
  getData() {

  }
}

//*************** implements *****************/

// 实现 Point 类里面的方法和属性
class Impostor implements Point {
  @override
  num x;
  @override
  num y;
  // 重写方法
  @override
  num getString() {
    return this.x;
  }
  getData() {

  }
}

Point point2 = Point.origin();        // 其他构造
Point point = Point()                 // 默认构造
    ..x = 10
    ..y = 20;
    
//*************** 可调用的类  *****************//

class Test {
    // 必须是call函数
    call(double a, String b, int c) {
      return '${a*4} ${b} ${c-6}';
    }
}

var test = new Test();
var result = test(166.6665,"Flutter真好玩",672);


//***************  getter 和 setter  ****************//
class Rectangle {
  num left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  num get right => left + width;
  set right(num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value - height;
}
func2(){
  var rect = Rectangle(3, 4, 20, 15);
  print(rect.left == 3); // true
  rect.right = 12;
  print(rect.left == -8); // true
}

//***************  最常见的构造函数形式  ****************//
class Test2 {
  int x, y;

  Test2(int x, int y) {
    this.x = x;//this.x指向的是当前Test类里面的变量int x
    this.y = y;
  }
}
//***************  Dart具有语法糖  ****************//
class Test3 {
  num x, y;
  
  // 构造函数运行之前设置x和y
  Test3(this.x, this.y) {
    print('x:$x, y:$y');
  }
}

// 如果没有内容体，可以使用简写形式，示例如下：
class Test4 {
  num x, y;
  
  // 构造函数运行之前设置x和y
  Test4(this.x, this.y);
}
//***************  命名构造函数  ****************//
class Test5{
  num x, y;

  // 命名构造
  Test5.help() {
    x = 5;
    y = 10;
    print('x=${x}, y = ${y}');
  }
}

//***************  重定向构造函数  ****************//
class Test6 {
  num a;
  bool b;
  String c;
  num d;
  // 主构造函数
  Test6(this.a, this.b, this.c, this.d);

  // 委托给主构造函数
  Test6.test1(num x,bool y) : this(x, y,'', 0);
  Test6.test2(num a,bool b, String c) : this(a, b, c, 0);
  Test6.test3(num a,bool b, String c,num d) : this(a, b, c, d);
}

//***************  常量构造函数  ****************//
class Test7 {
  static final Test7 origin = const Test7(5, 1);
  final num x;
  final num y;
  const Test7(this.x, this.y);
}

func(){
  var result = new Test7(4, 10);
  print('x=${result.x}, y:=${result.y}'); // x=4, y=10
  print(Test7.origin.x); // 5
  print(Test7.origin.y); // 1

  var a = const Test7(1, 1);
  var b = const Test7(1, 1);
  // 他们是相同示实例
  print(a == b); // true
}

//***************  factory实现的单例  ****************//
class Singleton {
  factory Singleton() => const Singleton._internal_();
  const Singleton._internal_();
}


//***************  初始化列表  ****************//
class Test1 {
  var x, y;
  Test1(var x, var y)
      : x = x,
        y = y {
    print('Test1 有参构造初始化');
  }
}

class Test8 {
  var x, y;
  Test8(var x, var y) : assert(x >= 0) {
    print('Test1(): ($x, $y)');
  }
}

// 如果没有更多实际操作内容，可以简写
class Test9 {
  var x, y;
  Test9(var x, var y) : assert(x >= 0);
}


// 设置final字段，初始化程序时更方便。
class Test10 {
  final num width;
  final num height;

  Test10(width, height): width = width,height = height;
}

